﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public class ContactsCollection : AbstractCollection
    {
        /// <summary>
        /// Стaтическая коллекция 
        /// </summary>
        protected static List<Contacts> _list;

        /// <summary>
        /// Список контактов
        /// </summary>
        public List<Contacts> ContactsList
        {
            get
            {
                //if (_list == null)
                //    _list = DB.Entities.Contacts.ToList();
                //return _list;
                return Entities.Contacts.ToList();
            }
        }


        /// <summary>
        /// Cписок контактов заполненными полями: ФИО, эл. почта, телефон, логин и пароль
        /// </summary>
        public List<Contacts> FullDefinedContactsList
        {
            get
            {
                var result = new List<Contacts>();
                foreach (Contacts item in ContactsList)
                {
                    if (!(String.IsNullOrEmpty(item.Name))
                        && !(String.IsNullOrEmpty(item.Phone))
                        && !(String.IsNullOrEmpty(item.Email))
                        && !(String.IsNullOrEmpty(item.LoginName))
                        && !(String.IsNullOrEmpty(item.Pass))
                        )
                    {
                        if (!result.Contains(item))
                            result.Add(item);
                    }
                }
                return result;
            }
        }

        /// <summary>
        /// Обнуление статической коллекции
        /// </summary>
        protected override void SetStaticListToNULL()
        {
            _list = null;
        }

        /// <summary>
        /// Получение статического списка для хранения объектов
        /// </summary>
        /// <returns></returns>
        public override object GetStaticCollection()
        {
            return _list;
        }

        /// <summary>
        /// Получение элемента из коллекции по идентификатору
        /// </summary>
        /// <param name="itemId">Идентификатор</param>
        /// <returns>Элемент</returns>
        public override object GetItemById(int itemId)
        {
            return Entities.Contacts.Find(itemId);
        }

        /// <summary>
        /// Возвращает контакт по логину или null(чего быть не должно т.к. пользователь авторизовался)
        /// </summary>
        /// <param name="loginName"></param>
        /// <returns></returns>
        public Contacts GetContactByLoginName(string loginName)
        {
            if (FullDefinedContactsList.Count > 0)
                foreach (Contacts item in FullDefinedContactsList)
                {
                    if (item.LoginName.Trim().ToUpper() == loginName.Trim().ToUpper())
                        return item;
                }
            return null;
        }

        /// <summary>
        /// Возвращает список заполненных контактов юр. лица (ФИО, телефон, эл. почта)
        /// </summary>
        /// <param name="idLegalEntity"></param>
        /// <returns></returns>
        public List<Contacts> GetFullDefinedContactsByLegalEntityId(int idLegalEntity)
        {
            var result = new List<Contacts>();
            var leCol = new LegalEntitiesCollection();
            var entity = (LegalEntities) leCol.GetItemById(idLegalEntity);
            if (entity != null)
            {
                foreach (Contacts item in entity.Contacts)
                {
                    if (!(String.IsNullOrEmpty(item.Name)) && !(String.IsNullOrEmpty(item.Phone)) &&
                        !(string.IsNullOrEmpty(item.Email)))
                    {
                        if (!result.Contains(item))
                            result.Add(item);
                    }
                }
            }
            return result;
        }

        /// <summary>
        /// Возвращает список заполненных контактов Клиента (ФИО, телефон, эл. почта)
        /// </summary>
        /// <param name="idCustomer"></param>
        /// <returns></returns>
        public List<Contacts> GetFullDefinedContactsByCustomerId(int idCustomer)
        {
            var customersCol = new CustomersCollection();
            var result = new List<Contacts>();
            var customer = (Customers) customersCol.GetItemById(idCustomer);
            if (customer != null)
            {
                if (customer.Contacts != null)
                {
                    foreach (Contacts item in customer.Contacts)
                    {
                        if (!(String.IsNullOrEmpty(item.Name)) && !(String.IsNullOrEmpty(item.Phone)) &&
                            !(string.IsNullOrEmpty(item.Email)))
                        {
                            if (!result.Contains(item))
                                result.Add(item);
                        }
                    }
                }
            }
            return result;
        }

        #region Overrides of AbstractCollection

        /// <summary>
        /// Получение типа текущего элемента
        /// </summary>
        /// <returns></returns>
        protected override Type GetItemType()
        {
            return typeof (Contacts);
        }

        /// <summary>
        /// Получение списка элементов
        /// </summary>
        /// <returns>Список элементов</returns>
        public override List<object> GetList()
        {
            return new List<object>(ContactsList);
        }

        /// <summary>
        /// Обновление элемента в коллекции
        /// </summary>
        /// <param name="item">Новый элемент</param>
        /// <param name="userLogin">Логин пользователя, который делает изменения</param>
        /// <returns>Результат операции</returns>
        public bool Update(object item, string userLogin, bool save = true)
        {
            var newObject = (Contacts) item;
            if (newObject == null)
                return false;


            var object4Update = GetItemByIdFromDatabase(newObject.GetKeyValue()) as Contacts;
            if (object4Update == null)
                return false;

            if (!string.IsNullOrEmpty(newObject.Name))
                object4Update.Name = newObject.Name;

            if (!string.IsNullOrEmpty(newObject.LoginName))
                object4Update.LoginName = newObject.LoginName;

            if (!string.IsNullOrEmpty(newObject.Comments))
                object4Update.Comments = newObject.Comments;

            if (newObject.Birthday != null)
                object4Update.Birthday = newObject.Birthday;

            if (!string.IsNullOrEmpty(newObject.Email))
                object4Update.Email = newObject.Email;

            if (newObject.IdLegalEntity != null)
                object4Update.IdLegalEntity = newObject.IdLegalEntity;

            if (!string.IsNullOrEmpty(newObject.Pass))
                object4Update.Pass = newObject.Pass;


            if (!string.IsNullOrEmpty(newObject.Phone))
                object4Update.Phone = newObject.Phone;

            if (!string.IsNullOrEmpty(newObject.Position))
                object4Update.Position = newObject.Position;


            if (!string.IsNullOrEmpty(newObject.Remind))
                object4Update.Remind = newObject.Remind;


            object4Update.IsActive = newObject.IsActive;


            return base.Update(object4Update, userLogin, save);
        }

        #endregion
    }
}